import axios from 'axios';
import store from '@/store';
import { Message } from 'element-ui';
import router from '@/router';
import { getTimeStamp } from './auth'

const timeOut = 36000 // 声明token失效时限的变量

// 创建一个axios实例，并设置基地址《《《《———————————————————————————————————
const service = axios.create({
    // baseURL: process.env.VUE_APP_BASE_API,
    baseURL: 'http://hmmm-api.itheima.net',
    timeout: 5000
});
// 添加请求拦截器《《《《———————————————————————————————————
service.interceptors.request.use((config) => {

    // token是存在vuex中的，引入store（vuex）后，判断是否有token，如果有，则将token注入到请求头中
    if (store.state.user.token) {
        // 如果函数返回的是正值，则超时《《《—————————————————————————————————————
        if (isTimeStampOut()) {
            store.dispatch('user/logOut') // 1、执行logOut函数，即删除token和用户资料
            router.push('/login') // 2、退出到登录页面
            Message.error('token超时,请重新登录!') // 提示错误信息
            return Promise.reject(new Error('token超时!请重新登录!')) // 3、 new一个错误对象，报出重新登录的警告
        }
        config.headers['Authorization'] = `Bearer ${store.state.user.token}` // 将token注入
    }
    return config;
}, (error) => {
    // 对请求错误做些什么
    return Promise.reject(error);
});


// 添加响应拦截器《《《《———————————————————————————————————
service.interceptors.response.use((response) => {
    // response表示服务器返回的数据。 如果返回的数据中，有success为true，则表示成功。正常返回数据
    const { status, statusText } = response
    if (status === 200) {
        return response.data; // 执行成功，直接返回数据data
    } else {
        console.log(statusText);
        Message.error('登录超时，请重新登录！') // 提示错误信息
        return Promise.reject(new Error('登录超时，请重新登录！'))
    }
}, (error) => {
    console.log(error);
    // 如果响应数据失败，则进入此函数。判断error.response.data.code ===10002,则为token失效
    if (error.response.status === 401) {
        // store.dispatch('/user/logOut')
        router.push('/login')
    } else {
        Message.error('登录超时，请重新登录！') // 提示错误信息
    }
    return Promise.reject(new Error('登录超时，请重新登录！'))
});

// 声明计算token时间戳是否过期的函数《《《《———————————————————————————————————
const isTimeStampOut = () => {
    const currentTime = Date.now() // 当前的时间戳
    const CookiesTime = getTimeStamp() // 获取Cookies中保存的时间戳
        // 将两个时间戳的差值，与timeOut进行比较
    return (currentTime - CookiesTime) / 1000 > timeOut // ? true : false(完整写法，可忽略)
}

export default service;